﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 垃圾回收的示例
{
    // 定义一个包含非托管资源的类（演示手动释放的必要性）
    public class ResourceHolder : IDisposable
    {
        private int _id;
        // 模拟非托管资源（如文件句柄、网络连接等，GC无法自动回收）
        private bool _isUnmanagedResourceReleased = false;

        public ResourceHolder(int id)
        {
            _id = id;
            Console.WriteLine($"[资源创建] 资源 {_id} 初始化（包含非托管资源）");
        }

        // 实现IDisposable接口：手动释放资源
        public void Dispose()
        {
            Dispose(true);
            // 告诉GC：已手动释放，无需再调用析构函数
            GC.SuppressFinalize(this);
        }

        // 核心释放逻辑
        protected virtual void Dispose(bool disposing)
        {
            if (!_isUnmanagedResourceReleased)
            {
                // 释放非托管资源
                _isUnmanagedResourceReleased = true;
                Console.WriteLine($"[手动释放] 资源 {_id} 的非托管资源已释放");

                // 如果是手动调用Dispose（disposing=true），释放托管资源
                if (disposing)
                {
                    Console.WriteLine($"[手动释放] 资源 {_id} 的托管资源已释放");
                }
            }
        }

        // 析构函数：仅在未手动释放时，由GC调用释放非托管资源
        ~ResourceHolder()
        {
            Dispose(false); // 只释放非托管资源
            Console.WriteLine($"[GC触发] 资源 {_id} 的析构函数被调用（未手动释放时）");
        }
    }

}
